섀도잉이란, 더 좁은(내부) 스코프에서 선언된 변수가 바깥 스코프의 동일한 이름의 변수를 가리는 현상입니다.
let status = "global";
function run() {
let status = "local"; // ← '섀도잉'
console.log(status); // "local"
}
run()
함수 내부의 status
는 외부의 status
를 가려서 무시📌 스코프가 깊어질수록, 더 가까운 스코프의 변수가 우선
특징 | 설명 |
---|---|
자동 적용된 | 변수명이 같으면 스코프에 따라 자동으로 발생 |
읽기 혼란 | 겉보기엔 같은 변수처럼 보여도 동작이 달라짐 |
디버깅 어려움 | 외부 값을 참조하려다 내부 값이 사용되는 등, 의도치 않은 결과 초래 가능 |
특히 함수형 코드, 중첩된 블록, 콜백 내부에서는 실수로 섀도잉이 발생하기 쉬움
let count = 1;
if (true) {
let count = 2; // 외부 count 섀도잉
console.log(count); // 2
}
console.log(count); // 1
const username = "Alice";
function greet(username) {
console.log(username); // 매개변수가 외부 변수를 섀도잉
}
let config = "default";
function load() {
let config = "loaded"; // 바깥 config를 섀도잉
setTimeout(() => {
console.log(config); // "loaded" (외부 config 아님)
}, 1000);
}
let userName = "Alice";
function handleUser() {
let currentUserName = "Bob"; // 섀도잉 피함
}
no-shadow
no-shadow
룰을 켜면 섀도잉 발생 시 경고를 줌function outer() {
let mode = "light";
function inner() {
let mode = "dark"; // 일부러 섀도잉
return mode;
}
}
✔️ 명확한 목적이 있거나 단기적으로 override하려는 경우만 허용